/**
  *  用法：
  *      var page = Pager.create({
  *          pager: "#pager",    //页码容器
  *          curPage: 1,      //当前页码
  *          sumPage: 20,     //总页数
  *          showNum: 7,    //最多显示几页，默认为7
  *          showFn: false,    //是否显示首页、上一页、下一页和尾页这些功能按钮，默认为true
  *          callback: function(cur) {     //每次翻页的回调事件，参数：翻页后的当前页页码
  *              console.log("当前是第" + cur + "页");
  *          }
  *      });
  *      page.setPage(9);    //设置页码
  *      page.reset({        //重设总页数
  *         curPage: 1,
  *         sumPage: 30
  *      });
  **/
var Pager = function(){ //定义单例
    var _class = function(options){//内部类
        var classParam="test";//对象私有变量
        this.options=$.extend({
            $pager:null,
            sumPage:1,
            curPage:1,
            showNum: 7,
            showFn: true,
            callback: null
        },options);
        this.$pager = $(options.pager);
        this.init(options);
    }
    _class.prototype = {//对象私有方法
        init : function(params){//对象初始化
            var options = this.options,
                that = this;

            this.writePages();
            this.$pager.unbind().bind("click", function(e) {   //绑定翻页按钮事件
                var $target = $(e.target),
                    curPage = parseInt($(e.target).data("num"));
                if ($target.hasClass("disabled") || !curPage) {
                    return;
                }
                options.curPage = curPage;
                that.writePages();
                options.callback && options.callback(options.curPage);
            });
        },
        getPageHtml: function(start, end) {
            var str = '';
            end = end || start;
            for (var i=start;i<=end;i++) {
                if (this.options.temp.indexOf(i + ",") >= 0 || i <= 0) {
                    
                } else {
                    this.options.temp += i + ","
                    str += '<a href="javascript:void(0)" data-num="' + i + '">' + i + '</a>';    
                }
            }
            return str;
        },
        setFn: function(html) {
            /* 设置首页、上一页、下一页、尾页这些功能按钮 */
            return '<a href="javascript:void(0)" class="front-page" data-type="first" data-num="1">首页</a>' +
                   '<a href="javascript:void(0)" class="front-page" data-type="prev" data-num="' + (this.options.curPage - 1) + '">上一页</a>' + 
                   html +
                   '<a href="javascript:void(0)" class="end-page" data-type="next" data-num="' + (this.options.curPage + 1) + '">下一页</a>' + 
                   '<a href="javascript:void(0)" class="end-page" data-type="last" data-num="' + this.options.sumPage + '">尾页</a>';
        },
        getDots: function() {
            return '<span>...</span>';
        },
        writePages: function() {
            var str = '',
                that = this,
                options = this.options;

            if (options.sumPage <= 1) {   //页数大于等于1时才展示页码
                this.$pager.html("");
                return;
            }
            options.temp = '';
            if (options.sumPage <= options.showNum) {  //总页数小于7，则全部显示
                str += this.getPageHtml(1, options.sumPage);
            } else {   //总页数大于showNum，则显示前后各两页和(options.showNum-4)页中间页
                str += this.getPageHtml(1, 2);
                var num = (options.showNum-4 + 1);   //当前页位置判断标志
                if (options.curPage <= num ) { //若当前页数小于等于num，则在后面加...
                    str += this.getPageHtml(3, num+1);
                    str += this.getDots();
                } else if (options.curPage > options.sumPage - num) {    //若当前页数大于等于num，则在线面加...
                    str += this.getDots();
                    str += this.getPageHtml(options.sumPage - num, options.sumPage);
                } else {
                    str += this.getDots();
                    var start = options.curPage-parseInt((options.showNum-4)/2),
                        end = start + (options.showNum-5);
                    str += this.getPageHtml(start, end);
                    if (options.curPage < options.sumPage - 2) {   //若当前页小于总页数减2，则后面还有需要省略的页数
                        str += this.getDots();
                    }
                }
                str += this.getPageHtml(options.sumPage - 1, options.sumPage);
            }
            if (options.showFn) {
                str = this.setFn(str);
            }
            this.$pager.html(str);
            this.$pager.find("a.cur").removeClass("cur");
            this.$pager.find("a[data-num='" + options.curPage + "']").not('.front-page').not('.end-page').addClass("cur");
            if (options.curPage == options.sumPage) {
                this.$pager.find(".end-page").addClass("disabled");
                this.$pager.find(".front-page").removeClass("disabled");
            } else if (options.curPage == 1) {
                this.$pager.find(".end-page").removeClass("disabled");
                this.$pager.find(".front-page").addClass("disabled");
            }
        },
        setPage: function(page) {
            if (!page || page <= 0 || page > this.options.sumPage) {
                throw '页码必须大于0且小于总页数';
            }
            this.options.curPage = page;
            this.writePages();
        },
        reset: function(options) {
            this.options=$.extend(this.options, options);
            this.$pager = $(this.options.pager);
            this.writePages();
        }
    }
    return {
        create : function(options){//提供给外部调用的方法，创建实例
            return new _class(options);
        }
    }
}();